纹理替换与瓦片贴图
地图瓦片(方块、地板、物件、装饰、格子效果)都画在几张大的精灵表上。每张表被切成大小相同的格子,源表行只记录要画哪一格(tiles 列)。把自己的美术放进游戏有两条路:
| 方式 | 目录 | 适用场景 |
|---|---|---|
| 纹理替换(Texture Replace) | Texture Replace/<表>_<槽位>.png | 重画一个已经存在的格子:vanilla 美术,或物品/NPC 精灵。 |
| 瓦片贴图(Tile Textures) | Texture/<表名>/<alias>.png | 给新增的 Block / Floor / Obj / Deco / CellEffect 行配图。游戏在启动时替你找一个空格。 |
新增的行不要用纹理替换
槽位号只是一个数字。两个 mod 选了同一个槽位会互相覆盖而且没有任何提示;游戏更新一旦用上那个格子,两个 mod 一起被盖掉。新增的行一律用下面的 Texture/<表名>/ 目录。
纹理替换
文件放进 mod 的 Texture Replace 目录,命名为 <表>_<槽位>.png(扩展名小写 .png)。
| 精灵表 | 格子尺寸 | 谁在用 |
|---|---|---|
block、blockSnow | 64×64 | Block 行(墙、方块、屋顶、柱子) |
floor、floorSnow | 64×48 | Floor 行 |
obj、objSnow | 64×64 | _idRenderData 为 obj 的 Obj 行 |
objS、objSSnow | 32×32 | obj_S / obj_S flat 的 Obj 行(小型植物、作物、杂草) |
objL、objLSnow | 80×64 | obj_L / obj_LV 的 Obj 行(树、高大物件) |
objC、objCL、objCLL | — | 使用槽位式 _idRenderData 的 Thing / Chara 精灵(见 Thing) |
- 槽位号:
行 * 100 + 列,从精灵表左上角那一格起算。它就是行的tiles列里的数字,也是纹理查看器(Esc → 工具 → 纹理查看器)显示的数字。 - 图片尺寸:格子尺寸的任意整数倍。更大的图从该槽位的左上角开始,向右、向下盖住相邻格子。
- 雪:
...Snow表是独立的。重画block_1234.png时也要重画blockSnow_1234.png。 - 游戏运行中文件会自动重载,不用重启就能调整。
给新增行配贴图
给行填上 alias,tiles 列留空(或保持默认的 0),把 PNG 放到 Texture/<表名>/<alias>.png:
Mod_MyTiles/
package.xml
LangMod/EN/mytiles.xlsx ← sheet 名为 Block / Floor / Obj / Material ...
Texture/
Block/
mymod_wall.png ← 64×256:墙 + 3 行柱子(见"墙与栅栏")
mymod_wall_snow.png ← 可选的雪季版本,尺寸相同
Floor/
mymod_floor.png ← 64×48
Obj/
mymod_statue.png ← 64×64
mymod_path.png ← 1024×48:16 种自动拼接边缘形状(floor_obj)
mymod_wheat.png ← 448×64:7 帧生长阶段<表名>是Block、Floor、Obj、Deco或CellEffect。目录名和文件名不区分大小写。- 文件名必须等于行的
alias。旁边再放一个<alias>_snow.png就是雪季版本。 - 图片必须是该行格子尺寸的整数倍(见上表;由行的
_idRenderData决定,例如obj_S flat→ 32×32,obj_LV→ 80×64)。最宽 99 格,最高 4 格。 - 启动时游戏在精灵表里挑一块空位,把你的图贴进去,再把格子号填进
tiles。空位不会用完:精灵表满了游戏会把它加大。Texture Replace文件占用的格子永远不会被分出去。
格子号不会存进存档
格子每次启动重新分配。存档只记你的行 id,所以装卸其他 mod 永远不会弄坏地图。不要自己往 tiles 里填格子号。
格子里画什么
Elin 是 2:1 等距视角,格子从来不是"整格填满":每类瓦片都有自己的形状和锚点,画成一个方块的结果就是又大又方、一半陷进地面。最省事的办法是把同类的 vanilla 格子当模板(Esc → 工具 → 纹理查看器)照着重画。下面的数字实测自 vanilla 精灵表,像素行从格子顶部数起:

贴地范围是一个 60×30 的菱形。 相邻瓦片横向相距 30 像素、纵向相距 15 像素,所以只有这个菱形能无缝平铺。每往下一行,形状必须正好宽 4 像素或窄 4 像素。斜率不对的菱形(比如 62×34)画得再大,相邻瓦片之间也会露出一条条斜向的地面。
贴地物件:只外扩朝后的两条边
前方那一格的地板永远盖在你的瓦片上面,所以朝前两条边(左下、右下)最外侧的几个像素不管怎么画都会被盖住;精细图案不要放在那里。朝后的两条边(左上、右上)不会被任何东西盖住,路面、田地下面的草就是从这里的接缝露出来的。
想让贴地物件和相邻的同类瓦片连成一片,就只在朝后的边上、且那一侧还有同一种瓦片时,把这条边向外扩约 5 像素;其余的边一律停在菱形边界上。四条边全部外扩只会把轮廓弄坏,看上去反而像瓦片没有拼接在一起。两处外扩在顶角处要分开:每条边只向它正对的那一格延伸,绝不要伸进斜后方那一格。
地毯要做成地板,不是物件
贴地物件盖不住它下面的草:每一格的地板都画在它后方各格物件的前面,而草叶会伸进后方那一格很远,落在地毯的中间而不只是边缘。vanilla 的地毯全是 Floor 行;vanilla 的 autotile 物件都是路、苔藓和栏杆,边缘毛糙反而显得自然。凡是要读作「一整片覆盖物」的东西都写进 Floor 表,autotile 物件留给路面。
| 格子 | 画在哪里 |
|---|---|
地板 Floor 64×48,以及 floor_obj 的平铺物件 | 以 (32, 25) 为中心的 60×30 菱形,即第 10–40 行。vanilla 地板画成「贴地范围 + 朝前两条边各多约 5 像素」,朝后的两条边不越界。厚板类地板会把顶面画低几行、下面再加一圈厚度,那是美术风格,不是硬性要求。 |
实心块 64×64(_idRenderData 留空) | 填满整格的等距立方体:顶面菱形加两个可见侧面。 |
薄墙 block_thin 64×64 | 墙是立在菱形左后边上的一块斜板,只用格子左侧 38 px(x 0–37,第 1–62 行),右侧留空。另一个方向由游戏自动镜像,所以只画一个方向。四行从上到下:墙 / 矮墙(第 16 行起)/ 转角柱(x 25–39,第 12 行起)/ 矮转角柱(第 28 行起)。 |
物件 obj 64×64 | 底部贴地、左右居中:脚点靠近格子底部(vanilla 多在第 57–63 行)。铺在地上的平面物件(路面、苔藓、落叶)不该用 obj:请用 floor_obj,它位于地板精灵表(64×48)、几何和地板完全一样,vanilla 的苔藓和花田就是这么做的。地毯则应该写进 Floor 表,见上面的提示。 |
小物件 obj_S flat 32×32 | 底部贴地(第 27–30 行)、左右居中;作物和杂草用它。 |
高物件 obj_LV 80×64 × 2 行 | 整棵树以两格的交界为中心:树干底部落在下格的上半部分(vanilla 帕鲁鲁树:第 0–28 行,下面 36 行留空),树冠在上格的下半部分(第 27–63 行)。收获帧(果实)也画在下格的同一位置。 |
一格一帧:条带
比一格更宽的 PNG 就是条带:每一格是一帧。帧的含义取决于行:
| 行 | 帧的含义 |
|---|---|
| 普通行 | 变体。游戏按朝向选一帧,和 vanilla 里 tiles 写多个值的行一样。 |
带 anime 列的行(Floor、Deco、CellEffect) | 动画帧。anime = 帧数,毫秒[,循环[,音效]]。 |
tag 含 autotile 的 Obj | 路面/田地的 16 种边缘形状。帧号 = 没有同类邻居的各侧之和:后 1、右 2、前 4、左 8。第 0 帧是四面都有邻居的内部块,第 15 帧是孤立块。对应到屏幕:左是左上边、后是右上边、右是右下边、前是左下边。贴地物件请把 _idRenderData 填成 floor_obj(帧为 64×48);地毯则写进 Floor 表。 |
| CellEffect | 8 帧;液体动画用第 5 到第 8 帧。 |
带 _growth 的 Obj | 生长阶段,见下文。 |
Obj 行的 anime 列不起作用,不要用。
墙与栅栏:下方多几行
_tileType 为墙或栅栏类型的 Block 由上下叠放的四格画出来:墙本身、低墙(压低墙壁视角时显示)、转角柱、低墙转角柱。图要做成 4 格高,从上到下按这个顺序。栅栏至少要有墙和柱子两行。
高大物件:上方多一行
用 obj_LV 绘制的物件(树和其他高大物件)会多用基格上方的一格。图做成 2 行高:树干在下行(底部落在下格的上半部分),树冠在上行,见上文「格子里画什么」。
生长条带(作物、树、杂草)
带 _growth 列的行(_growth = 类型,阶段帧,收获帧,收获物,最大数量)用条带存放生长阶段。阶段帧 和 收获帧 填的是你条带里的帧号,从 0 数起。
_growth 类型 | 阶段帧数 | 收获帧 | 示例 _growth |
|---|---|---|---|
Crop、Berry、Plant、Flower、SunFlower、Herb | 4(第一阶段用游戏自带的嫩芽图) | 可选,1 帧 | Crop,0,4,carrot,2 → 5 帧 |
Rose、Cactus、Cha、Pasture、Seaweed | 5 | 可选 | Rose,0,5,flower,1 → 6 帧 |
Kinoko | 4 | 无(写 0) | Kinoko,0,0,#mushroom |
Wheat、Rice | 5 | 必填,2 帧:结穗,然后是收割后 | Wheat,0,5,wheat,2 → 7 帧 |
Tree、TreeFeywood | 5(前两个阶段共用第 0 帧),2 行高 | 可选,叠在树干上 | Tree,0,5,apple,3 → 6 帧 × 2 行 |
Weed | 5 帧;第 3 帧是菜单里显示的那张 | — | Weed,0 |
Deco、TreeCoralwood | 帧是变体,没有阶段 | — | Deco,0 |
收获物是你收到的东西(物品 id,或#分类表示该分类的随机物品);最大数量是一次最多能收多少。- 菜单图标自动挑选:树用第 2 帧,其他植物有收获帧就用收获帧,否则用成熟阶段。
- 树需要
_idRenderData=obj_LV、_tileType=Tree、valType=Growth;小型作物和杂草用obj_S flat。 - 条带太短只会让缺的阶段留白,绝不会画到别的 mod 的格子上。
作物还需要哪些列,见瓦片表。
雪
瓦片被雪覆盖时,雪季美术叠在正常美术之上,所以没有 _snow.png 的瓦片冬天只是保持原样。
- Block:想要雪景版本就加
<alias>_snow.png(尺寸相同,含柱子行)。 - Floor:下雪时户外地板会整体换成雪地,除非行的
tag里有noSnow。_snow.png只对仍然显示的地板有意义。 - Obj:物件冬天外观不变,可以不做雪图。
snowTile> 0 的 Obj 行会反过来被雪盖住不显示。
边玩边改
瓦片 PNG 和其他替换一样,文件一变就重载。游戏运行中不要改图片尺寸:空位是启动时预留的,更大的文件会溢出到旁边的格子,直到你重启。